WebAssembly์ ์ ํ ๋ฉ๋ชจ๋ฆฌ์ ๋์ ๋ฉ๋ชจ๋ฆฌ ํ์ฅ์ด ์ด๋ป๊ฒ ํจ์จ์ ์ด๊ณ ๊ฐ๋ ฅํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฅํ๊ฒ ํ๋์ง ์์๋ณด์ธ์. ๋ณต์ก์ฑ, ์ด์ , ์ ์ฌ์ ์ธ ์ํ์ ์ดํดํฉ๋๋ค.
WebAssembly ์ ํ ๋ฉ๋ชจ๋ฆฌ ํ์ฅ: ๋์ ๋ฉ๋ชจ๋ฆฌ ํ์ฅ์ ๋ํ ์ฌ์ธต ๋ถ์
WebAssembly(Wasm)๋ ์ด์์ฑ ์๊ณ ํจ์จ์ ์ด๋ฉฐ ์์ ํ ์คํ ํ๊ฒฝ์ ์ ๊ณตํ์ฌ ์น ๊ฐ๋ฐ๊ณผ ๊ทธ ์ด์์ ํ์ ํ์ต๋๋ค. Wasm์ ํต์ฌ ๊ตฌ์ฑ ์์๋ WebAssembly ๋ชจ๋์ ๊ธฐ๋ณธ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ ์ญํ ์ ํ๋ ์ ํ ๋ฉ๋ชจ๋ฆฌ์ ๋๋ค. ์ ํ ๋ฉ๋ชจ๋ฆฌ์ ์๋ ๋ฐฉ์, ํนํ ๊ทธ ํ์ฅ ๋ฉ์ปค๋์ฆ์ ์ดํดํ๋ ๊ฒ์ ์ฑ๋ฅ์ด ๋ฐ์ด๋๊ณ ๊ฒฌ๊ณ ํ Wasm ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค.
WebAssembly ์ ํ ๋ฉ๋ชจ๋ฆฌ๋ ๋ฌด์์ธ๊ฐ?
WebAssembly์ ์ ํ ๋ฉ๋ชจ๋ฆฌ๋ ์ฐ์์ ์ด๊ณ ํฌ๊ธฐ ์กฐ์ ์ด ๊ฐ๋ฅํ ๋ฐ์ดํธ ๋ฐฐ์ด์ ๋๋ค. ์ด๋ Wasm ๋ชจ๋์ด ์ง์ ์ ๊ทผํ ์ ์๋ ์ ์ผํ ๋ฉ๋ชจ๋ฆฌ์ ๋๋ค. WebAssembly ๊ฐ์ ๋จธ์ ๋ด์ ์์ฃผํ๋ ํฐ ๋ฐ์ดํธ ๋ฐฐ์ด์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋ฉ๋๋ค.
์ ํ ๋ฉ๋ชจ๋ฆฌ์ ์ฃผ์ ํน์ง:
- ์ฐ์์ฑ: ๋ฉ๋ชจ๋ฆฌ๋ ๋จ์ผํ๊ณ ๋์ด์ง์ง ์์ ๋ธ๋ก์ผ๋ก ํ ๋น๋ฉ๋๋ค.
- ์ฃผ์ ์ง์ ๊ฐ๋ฅ: ๊ฐ ๋ฐ์ดํธ๋ ๊ณ ์ ํ ์ฃผ์๋ฅผ ๊ฐ์ง๋ฏ๋ก ์ง์ ์ฝ๊ณ ์ธ ์ ์์ต๋๋ค.
- ํฌ๊ธฐ ์กฐ์ ๊ฐ๋ฅ: ๋ฉ๋ชจ๋ฆฌ๋ ๋ฐํ์ ์ค์ ํ์ฅ๋ ์ ์์ด ๋์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ด ๊ฐ๋ฅํฉ๋๋ค.
- ํ์ ๊ธฐ๋ฐ ์ ๊ทผ: ๋ฉ๋ชจ๋ฆฌ ์์ฒด๋ ๋ฐ์ดํธ์ ๋ถ๊ณผํ์ง๋ง, WebAssembly ๋ช ๋ น์ด๋ ํ์ ๊ธฐ๋ฐ ์ ๊ทผ(์: ํน์ ์ฃผ์์์ ์ ์๋ ๋ถ๋ ์์์ ์ซ์ ์ฝ๊ธฐ)์ ํ์ฉํฉ๋๋ค.
์ฒ์์๋ Wasm ๋ชจ๋์ด ๋ชจ๋์ ์ด๊ธฐ ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ์ ์ํด ์ ์๋ ํน์ ์์ ์ ํ ๋ฉ๋ชจ๋ฆฌ๋ก ์์ฑ๋ฉ๋๋ค. ์ด ์ด๊ธฐ ํฌ๊ธฐ๋ ํ์ด์ง ๋จ์๋ก ์ง์ ๋๋ฉฐ, ๊ฐ ํ์ด์ง๋ 65,536๋ฐ์ดํธ(64KB)์ ๋๋ค. ๋ชจ๋์ ๋ํ ํ์๋ก ํ ์ต๋ ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค. ์ด๋ Wasm ๋ชจ๋์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ ํํ๊ณ ์ ์ด๋์ง ์๋ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ๋ฐฉ์งํ์ฌ ๋ณด์์ ๊ฐํํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
์ ํ ๋ฉ๋ชจ๋ฆฌ๋ ๊ฐ๋น์ง ์ปฌ๋ ์ ๋์ง ์์ต๋๋ค. ๋ฉ๋ชจ๋ฆฌ ํ ๋น ๋ฐ ํด์ ๋ฅผ ์๋์ผ๋ก ๊ด๋ฆฌํ๋ ๊ฒ์ Wasm ๋ชจ๋ ๋๋ Wasm์ผ๋ก ์ปดํ์ผ๋๋ ์ฝ๋(์: C ๋๋ Rust)์ ์ฑ ์์ ๋๋ค.
์ ํ ๋ฉ๋ชจ๋ฆฌ ํ์ฅ์ด ์ ์ค์ํ๊ฐ?
๋ง์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ํ์๋ก ํฉ๋๋ค. ๋ค์๊ณผ ๊ฐ์ ์๋๋ฆฌ์ค๋ฅผ ๊ณ ๋ คํด ๋ณด์ธ์:
- ๋์ ์๋ฃ ๊ตฌ์กฐ: ๋์ ํฌ๊ธฐ์ ๋ฐฐ์ด, ๋ฆฌ์คํธ ๋๋ ํธ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์ดํฐ๊ฐ ์ถ๊ฐ๋ ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํด์ผ ํฉ๋๋ค.
- ๋ฌธ์์ด ์กฐ์: ๊ฐ๋ณ ๊ธธ์ด ๋ฌธ์์ด์ ์ฒ๋ฆฌํ๋ ค๋ฉด ๋ฌธ์์ด ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํด์ผ ํฉ๋๋ค.
- ์ด๋ฏธ์ง ๋ฐ ๋น๋์ค ์ฒ๋ฆฌ: ์ด๋ฏธ์ง๋ ๋น๋์ค๋ฅผ ๋ก๋ํ๊ณ ์ฒ๋ฆฌํ๋ ๊ฒ์ ์ข ์ข ํฝ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๋ฒํผ๋ฅผ ํ ๋นํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค.
- ๊ฒ์ ๊ฐ๋ฐ: ๊ฒ์์ ๊ฒ์ ๊ฐ์ฒด, ํ ์ค์ฒ ๋ฐ ๊ธฐํ ๋ฆฌ์์ค๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด ๋์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์์ฃผ ์ฌ์ฉํฉ๋๋ค.
์ ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ฅํ ์ ์๋ค๋ฉด Wasm ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ธฐ๋ฅ์ ์ฌ๊ฐํ๊ฒ ์ ํ๋ ๊ฒ์ ๋๋ค. ๊ณ ์ ํฌ๊ธฐ ๋ฉ๋ชจ๋ฆฌ๋ ๊ฐ๋ฐ์๊ฐ ์ด๊ธฐ์ ๋ง์ ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ฏธ๋ฆฌ ํ ๋นํ๋๋ก ๊ฐ์ํ์ฌ ์ ์ฌ์ ์ผ๋ก ๋ฆฌ์์ค๋ฅผ ๋ญ๋นํ๊ฒ ๋ง๋ญ๋๋ค. ์ ํ ๋ฉ๋ชจ๋ฆฌ ํ์ฅ์ ํ์์ ๋ฐ๋ผ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๋ ์ ์ฐํ๊ณ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
WebAssembly์์ ์ ํ ๋ฉ๋ชจ๋ฆฌ ํ์ฅ์ด ์๋ํ๋ ๋ฐฉ์
memory.grow ๋ช
๋ น์ด๋ WebAssembly์ ์ ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋์ ์ผ๋ก ํ์ฅํ๋ ํต์ฌ์
๋๋ค. ์ด ๋ช
๋ น์ด๋ ํ์ฌ ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ์ ์ถ๊ฐํ ํ์ด์ง ์๋ฅผ ๋จ์ผ ์ธ์๋ก ๋ฐ์ต๋๋ค. ํ์ฅ์ด ์ฑ๊ณตํ๋ฉด ์ด์ ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ(ํ์ด์ง ๋จ์)๋ฅผ ๋ฐํํ๊ณ , ํ์ฅ์ด ์คํจํ๋ฉด(์: ์์ฒญ๋ ํฌ๊ธฐ๊ฐ ์ต๋ ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ๋ฅผ ์ด๊ณผํ๊ฑฐ๋ ํธ์คํธ ํ๊ฒฝ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ถฉ๋ถํ์ง ์์ ๊ฒฝ์ฐ) -1์ ๋ฐํํฉ๋๋ค.
๊ฐ๋จํ ์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์ด๊ธฐ ๋ฉ๋ชจ๋ฆฌ: Wasm ๋ชจ๋์ ์ด๊ธฐ์ ์ ํด์ง ์์ ๋ฉ๋ชจ๋ฆฌ ํ์ด์ง(์: 1 ํ์ด์ง = 64KB)๋ก ์์ํฉ๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ ์์ฒญ: Wasm ์ฝ๋๋ ๋ ๋ง์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ์ํ๋ค๊ณ ํ๋จํฉ๋๋ค.
memory.growํธ์ถ: Wasm ์ฝ๋๋memory.grow๋ช ๋ น์ด๋ฅผ ์คํํ์ฌ ํน์ ์์ ํ์ด์ง๋ฅผ ์ถ๊ฐํ๋๋ก ์์ฒญํฉ๋๋ค.- ๋ฉ๋ชจ๋ฆฌ ํ ๋น: Wasm ๋ฐํ์(์: ๋ธ๋ผ์ฐ์ ๋๋ ๋ ๋ฆฝํ Wasm ์์ง)์ ์์ฒญ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๋ ค๊ณ ์๋ํฉ๋๋ค.
- ์ฑ๊ณต ๋๋ ์คํจ: ํ ๋น์ด ์ฑ๊ณตํ๋ฉด ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ๊ฐ ์ฆ๊ฐํ๊ณ ์ด์ ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ(ํ์ด์ง ๋จ์)๊ฐ ๋ฐํ๋ฉ๋๋ค. ํ ๋น์ด ์คํจํ๋ฉด -1์ด ๋ฐํ๋ฉ๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ: Wasm ์ฝ๋๋ ์ด์ ์ ํ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์ฌ์ฉํ์ฌ ์๋ก ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํ ์ ์์ต๋๋ค.
์์ (๊ฐ๋ ์ Wasm ์ฝ๋):
;; ์ด๊ธฐ ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ๊ฐ 1 ํ์ด์ง(64KB)๋ผ๊ณ ๊ฐ์
(module
(memory (import "env" "memory") 1)
(func (export "allocate") (param $size i32) (result i32)
;; $size๋ ํ ๋นํ ๋ฐ์ดํธ ์
(local $pages i32)
(local $ptr i32)
;; ํ์ํ ํ์ด์ง ์ ๊ณ์ฐ
(local.set $pages (i32.div_u (i32.add $size 65535) (i32.const 65536))) ; ๊ฐ์ฅ ๊ฐ๊น์ด ํ์ด์ง๋ก ์ฌ๋ฆผ
;; ๋ฉ๋ชจ๋ฆฌ ํ์ฅ
(local $ptr (memory.grow (local.get $pages)))
(if (i32.eqz (local.get $ptr))
;; ๋ฉ๋ชจ๋ฆฌ ํ์ฅ ์คํจ
(i32.const -1) ; ์คํจ๋ฅผ ๋ํ๋ด๊ธฐ ์ํด -1 ๋ฐํ
(then
;; ๋ฉ๋ชจ๋ฆฌ ํ์ฅ ์ฑ๊ณต
(i32.mul (local.get $ptr) (i32.const 65536)) ; ํ์ด์ง๋ฅผ ๋ฐ์ดํธ๋ก ๋ณํ
(i32.add (local.get $ptr) (i32.const 0)) ; ์คํ์
0๋ถํฐ ํ ๋น ์์
)
)
)
)
์ด ์์ ๋ ์ง์ ๋ ํฌ๊ธฐ๋ฅผ ์์ฉํ๊ธฐ ์ํด ํ์ํ ํ์ด์ง ์๋งํผ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ฅํ๋ ๊ฐ๋จํ allocate ํจ์๋ฅผ ๋ณด์ฌ์ค๋๋ค. ๊ทธ๋ฐ ๋ค์ ์๋ก ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ์ ์์ ์ฃผ์๋ฅผ ๋ฐํํฉ๋๋ค(ํ ๋น ์คํจ ์ -1).
์ ํ ๋ฉ๋ชจ๋ฆฌ ํ์ฅ ์ ๊ณ ๋ ค ์ฌํญ
memory.grow๋ ๊ฐ๋ ฅํ์ง๋ง ๊ทธ ์ํฅ์ ์ผ๋์ ๋๋ ๊ฒ์ด ์ค์ํฉ๋๋ค:
- ์ฑ๋ฅ: ๋ฉ๋ชจ๋ฆฌ ํ์ฅ์ ์๋์ ์ผ๋ก ๋น์ฉ์ด ๋ง์ด ๋๋ ์์ ์ผ ์ ์์ต๋๋ค. ์ ๋ฉ๋ชจ๋ฆฌ ํ์ด์ง๋ฅผ ํ ๋นํ๊ณ ์ ์ฌ์ ์ผ๋ก ๊ธฐ์กด ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ๋ ๊ณผ์ ์ด ํฌํจ๋ฉ๋๋ค. ์์ ๋ฉ๋ชจ๋ฆฌ ํ์ฅ์ ์์ฃผ ํ๋ฉด ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ ๋จํธํ: ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ํ ๋นํ๊ณ ํด์ ํ๋ฉด ๋จํธํ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์ด๋ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์๊ณ ๋น์ฐ์์ ์ธ ์ฒญํฌ๋ก ํฉ์ด์ง๋ ํ์์ ๋๋ค. ์ด๋ก ์ธํด ๋์ค์ ๋ ํฐ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ํ ๋นํ๊ธฐ ์ด๋ ค์์ง ์ ์์ต๋๋ค.
- ์ต๋ ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ: Wasm ๋ชจ๋์๋ ์ต๋ ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ๊ฐ ์ง์ ๋์ด ์์ ์ ์์ต๋๋ค. ์ด ํ๊ณ๋ฅผ ์ด๊ณผํ์ฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ฅํ๋ ค๊ณ ํ๋ฉด ์คํจํฉ๋๋ค.
- ํธ์คํธ ํ๊ฒฝ ์ ํ: ํธ์คํธ ํ๊ฒฝ(์: ๋ธ๋ผ์ฐ์ ๋๋ ์ด์ ์ฒด์ )์๋ ์์ฒด ๋ฉ๋ชจ๋ฆฌ ์ ํ์ด ์์ ์ ์์ต๋๋ค. Wasm ๋ชจ๋์ ์ต๋ ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ์ ๋๋ฌํ์ง ์๋๋ผ๋ ํธ์คํธ ํ๊ฒฝ์ด ๋ ๋ง์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ๊ฑฐ๋ถํ ์ ์์ต๋๋ค.
- ์ ํ ๋ฉ๋ชจ๋ฆฌ ์ฌ๋ฐฐ์น: ์ผ๋ถ Wasm ๋ฐํ์์
memory.grow์์ ์ค์ ์ ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ค๋ฅธ ๋ฉ๋ชจ๋ฆฌ ์์น๋ก ์ด๋ํ๋๋ก ์ ํํ *์๋* ์์ต๋๋ค. ๋๋ฌผ์ง๋ง ๋ชจ๋์ด ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์๋ชป ์บ์ํ๋ฉด ํฌ์ธํฐ๊ฐ ๋ฌดํจํ๋ ์ ์์ผ๋ฏ๋ก ์ด ๊ฐ๋ฅ์ฑ์ ์ธ์งํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
WebAssembly์์ ๋์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
์ ํ ๋ฉ๋ชจ๋ฆฌ ํ์ฅ๊ณผ ๊ด๋ จ๋ ์ ์ฌ์ ์ธ ๋ฌธ์ ๋ฅผ ์ํํ๋ ค๋ฉด ๋ค์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๊ณ ๋ คํ์ญ์์ค:
- ์ฒญํฌ ๋จ์๋ก ํ ๋น: ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์์ฃผ ํ ๋นํ๋ ๋์ ๋ ํฐ ์ฒญํฌ๋ฅผ ํ ๋นํ๊ณ ํด๋น ์ฒญํฌ ๋ด์์ ํ ๋น์ ๊ด๋ฆฌํ์ญ์์ค. ์ด๋ ๊ฒ ํ๋ฉด
memory.growํธ์ถ ํ์๊ฐ ์ค์ด๋ค๊ณ ์ฑ๋ฅ์ด ํฅ์๋ ์ ์์ต๋๋ค. - ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ์ฌ์ฉ: ์ ํ ๋ฉ๋ชจ๋ฆฌ ๋ด์์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ๋ฐ ํด์ ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด ๋ฉ๋ชจ๋ฆฌ ํ ๋น์(์: ์ฌ์ฉ์ ์ง์ ํ ๋น์ ๋๋ jemalloc๊ณผ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ)๋ฅผ ๊ตฌํํ๊ฑฐ๋ ์ฌ์ฉํ์ญ์์ค. ๋ฉ๋ชจ๋ฆฌ ํ ๋น์๋ ๋จํธํ๋ฅผ ์ค์ด๊ณ ํจ์จ์ฑ์ ํฅ์์ํค๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
- ํ ํ ๋น: ๋์ผํ ํฌ๊ธฐ์ ๊ฐ์ฒด์ ๋ํด์๋ ํ ํ ๋น์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค. ์ด๋ ๊ณ ์ ๋ ์์ ๊ฐ์ฒด๋ฅผ ๋ฏธ๋ฆฌ ํ ๋นํ๊ณ ํ์์ ๊ด๋ฆฌํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค. ์ด๋ ๋ฐ๋ณต์ ์ธ ํ ๋น ๋ฐ ํด์ ์ ์ค๋ฒํค๋๋ฅผ ํผํ ์ ์์ต๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฌ์ฉ: ๊ฐ๋ฅํ๋ฉด ์ด์ ์ ํ ๋น๋์์ง๋ง ๋ ์ด์ ํ์ํ์ง ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฌ์ฉํ์ญ์์ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ฅํ ํ์์ฑ์ ์ค์ผ ์ ์์ต๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ ๋ณต์ฌ ์ต์ํ: ๋ง์ ์์ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ๋ ๊ฒ์ ๋น์ฉ์ด ๋ง์ด ๋ค ์ ์์ต๋๋ค. ์ธํ๋ ์ด์ค(in-place) ์์ ์ด๋ ์ ๋ก ์นดํผ(zero-copy) ์ ๊ทผ ๋ฐฉ์๊ณผ ๊ฐ์ ๊ธฐ์ ์ ์ฌ์ฉํ์ฌ ๋ฉ๋ชจ๋ฆฌ ๋ณต์ฌ๋ฅผ ์ต์ํํ์ญ์์ค.
- ์ ํ๋ฆฌ์ผ์ด์ ํ๋กํ์ผ๋ง: ํ๋กํ์ผ๋ง ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ํจํด๊ณผ ์ ์ฌ์ ์ธ ๋ณ๋ชฉ ํ์์ ์๋ณํ์ญ์์ค. ์ด๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ์ ๋ต์ ์ต์ ํํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
- ํฉ๋ฆฌ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ์ ํ ์ค์ : Wasm ๋ชจ๋์ ๋ํด ํ์ค์ ์ธ ์ด๊ธฐ ๋ฐ ์ต๋ ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ๋ฅผ ์ ์ํ์ญ์์ค. ์ด๋ ๋ฌด๋ถ๋ณํ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ๋ฐฉ์งํ๊ณ ๋ณด์์ ํฅ์์ํค๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ์ ๋ต
Wasm์ ์ํ ๋ช ๊ฐ์ง ์ธ๊ธฐ ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ์ ๋ต์ ์ดํด๋ณด๊ฒ ์ต๋๋ค:
1. ์ฌ์ฉ์ ์ง์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์
์ฌ์ฉ์ ์ง์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์๋ฅผ ์์ฑํ๋ฉด ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ์ธ๋ฐํ๊ฒ ์ ์ดํ ์ ์์ต๋๋ค. ๋ค์๊ณผ ๊ฐ์ ๋ค์ํ ํ ๋น ์ ๋ต์ ๊ตฌํํ ์ ์์ต๋๋ค:
- First-Fit (์ต์ด ์ ํฉ): ํ ๋น ์์ฒญ์ ๋ง์กฑ์ํฌ ๋งํผ ์ถฉ๋ถํ ํฐ ์ฒซ ๋ฒ์งธ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ์ฌ์ฉํฉ๋๋ค.
- Best-Fit (์ต์ ์ ํฉ): ์ถฉ๋ถํ ํฐ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก ์ค ๊ฐ์ฅ ์์ ๊ฒ์ ์ฌ์ฉํฉ๋๋ค.
- Worst-Fit (์ต์ ์ ํฉ): ์ฌ์ฉ ๊ฐ๋ฅํ ๊ฐ์ฅ ํฐ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ์ฌ์ฉํฉ๋๋ค.
์ฌ์ฉ์ ์ง์ ํ ๋น์๋ ๋ฉ๋ชจ๋ฆฌ ๋์์ ๋จํธํ๋ฅผ ํผํ๊ธฐ ์ํด ์ ์คํ ๊ตฌํ์ด ํ์ํฉ๋๋ค.
2. ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ ๋น์ (์: malloc/free)
C ๋ฐ C++์ ๊ฐ์ ์ธ์ด๋ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ์ํด malloc ๋ฐ free์ ๊ฐ์ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํจ์๋ฅผ ์ ๊ณตํฉ๋๋ค. Emscripten๊ณผ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ Wasm์ผ๋ก ์ปดํ์ผํ ๋ ์ด๋ฌํ ํจ์๋ ์ผ๋ฐ์ ์ผ๋ก Wasm ๋ชจ๋์ ์ ํ ๋ฉ๋ชจ๋ฆฌ ๋ด์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํ๋ฉ๋๋ค.
์์ (C ์ฝ๋):
#include
#include
int main() {
int *arr = (int *)malloc(10 * sizeof(int)); // 10๊ฐ์ ์ ์๋ฅผ ์ํ ๋ฉ๋ชจ๋ฆฌ ํ ๋น
if (arr == NULL) {
printf("๋ฉ๋ชจ๋ฆฌ ํ ๋น ์คํจ!\n");
return 1;
}
// ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ
for (int i = 0; i < 10; i++) {
arr[i] = i * 2;
printf("arr[%d] = %d\n", i, arr[i]);
}
free(arr); // ๋ฉ๋ชจ๋ฆฌ ํด์
return 0;
}
์ด C ์ฝ๋๊ฐ Wasm์ผ๋ก ์ปดํ์ผ๋ ๋ Emscripten์ Wasm ์ ํ ๋ฉ๋ชจ๋ฆฌ์์ ์๋ํ๋ malloc ๋ฐ free์ ๊ตฌํ์ ์ ๊ณตํฉ๋๋ค. malloc ํจ์๋ Wasm ํ์์ ๋ ๋ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํด์ผ ํ ๋ memory.grow๋ฅผ ํธ์ถํฉ๋๋ค. ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํ๋ ค๋ฉด ํญ์ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํด์ผ ํฉ๋๋ค.
3. ๊ฐ๋น์ง ์ปฌ๋ ์ (GC)
JavaScript, Python, Java์ ๊ฐ์ ์ผ๋ถ ์ธ์ด๋ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ์ฌ์ฉํ์ฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋์ผ๋ก ๊ด๋ฆฌํฉ๋๋ค. ์ด๋ฌํ ์ธ์ด๋ฅผ Wasm์ผ๋ก ์ปดํ์ผํ ๋ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ Wasm ๋ชจ๋ ๋ด์์ ๊ตฌํ๋๊ฑฐ๋ Wasm ๋ฐํ์์ ์ํด ์ ๊ณต๋์ด์ผ ํฉ๋๋ค(GC ์ ์์ด ์ง์๋๋ ๊ฒฝ์ฐ). ์ด๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ์๋นํ ๋จ์ํํ ์ ์์ง๋ง ๊ฐ๋น์ง ์ปฌ๋ ์ ์ฃผ๊ธฐ์ ๊ด๋ จ๋ ์ค๋ฒํค๋๋ ๋ฐ์์ํต๋๋ค.
WebAssembly์ GC ํํฉ: ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ์ฌ์ ํ ๋ฐ์ ์ค์ธ ๊ธฐ๋ฅ์ ๋๋ค. ํ์คํ๋ GC์ ๋ํ ์ ์์ด ์งํ ์ค์ด์ง๋ง ์์ง ๋ชจ๋ Wasm ๋ฐํ์์์ ๋ณดํธ์ ์ผ๋ก ๊ตฌํ๋์ง๋ ์์์ต๋๋ค. ์ค์ ๋ก๋ GC์ ์์กดํ๋ ์ธ์ด๊ฐ Wasm์ผ๋ก ์ปดํ์ผ๋ ๋ ํด๋น ์ธ์ด์ ํน์ ํ GC ๊ตฌํ์ด ์ปดํ์ผ๋ Wasm ๋ชจ๋ ๋ด์ ํฌํจ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
4. Rust์ ์์ ๊ถ ๋ฐ ๋์ฌ
Rust๋ ๋ฉ๋ชจ๋ฆฌ ๋์์ ๋๊ธ๋ง ํฌ์ธํฐ๋ฅผ ๋ฐฉ์งํ๋ฉด์ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ํ์์ฑ์ ์์ ๋ ๋ ํนํ ์์ ๊ถ ๋ฐ ๋์ฌ ์์คํ ์ ์ฌ์ฉํฉ๋๋ค. Rust ์ปดํ์ผ๋ฌ๋ ๋ฉ๋ชจ๋ฆฌ ์์ ๊ถ์ ๋ํ ์๊ฒฉํ ๊ท์น์ ์ ์ฉํ์ฌ ๊ฐ ๋ฉ๋ชจ๋ฆฌ ์กฐ๊ฐ์ด ๋จ์ผ ์์ ์๋ฅผ ๊ฐ์ง๋ฉฐ ๋ฉ๋ชจ๋ฆฌ์ ๋ํ ์ฐธ์กฐ๊ฐ ํญ์ ์ ํจํ๋๋ก ๋ณด์ฅํฉ๋๋ค.
์์ (Rust ์ฝ๋):
fn main() {
let mut v = Vec::new(); // ์ ๋ฒกํฐ(๋์ ํฌ๊ธฐ ๋ฐฐ์ด) ์์ฑ
v.push(1); // ๋ฒกํฐ์ ์์ ์ถ๊ฐ
v.push(2);
v.push(3);
println!("Vector: {:?}", v);
// ์๋์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํ ํ์ ์์ - 'v'๊ฐ ๋ฒ์๋ฅผ ๋ฒ์ด๋ ๋ Rust๊ฐ ์๋์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค.
}
Rust ์ฝ๋๋ฅผ Wasm์ผ๋ก ์ปดํ์ผํ ๋ ์์ ๊ถ ๋ฐ ๋์ฌ ์์คํ ์ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ์์กดํ์ง ์๊ณ ๋ฉ๋ชจ๋ฆฌ ์์ ์ฑ์ ๋ณด์ฅํฉ๋๋ค. Rust ์ปดํ์ผ๋ฌ๋ ๋ฐฐํ์์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ๋ฐ ํด์ ๋ฅผ ๊ด๋ฆฌํ๋ฏ๋ก ๊ณ ์ฑ๋ฅ Wasm ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ๋๋ฆฌ ์ฌ์ฉ๋ฉ๋๋ค.
์ ํ ๋ฉ๋ชจ๋ฆฌ ํ์ฅ์ ์ค์ ์์
1. ๋์ ๋ฐฐ์ด ๊ตฌํ
Wasm์์ ๋์ ๋ฐฐ์ด์ ๊ตฌํํ๋ฉด ํ์์ ๋ฐ๋ผ ์ ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ด๋ป๊ฒ ํ์ฅํ ์ ์๋์ง ๋ณด์ฌ์ค๋๋ค.
๊ฐ๋ ์ ๋จ๊ณ:
- ์ด๊ธฐํ: ๋ฐฐ์ด์ ์์ ์ด๊ธฐ ์ฉ๋์ผ๋ก ์์ํฉ๋๋ค.
- ์์ ์ถ๊ฐ: ์์๋ฅผ ์ถ๊ฐํ ๋ ๋ฐฐ์ด์ด ๊ฐ๋ ์ฐผ๋์ง ํ์ธํฉ๋๋ค.
- ํ์ฅ: ๋ฐฐ์ด์ด ๊ฐ๋ ์ฐจ๋ฉด
memory.grow๋ฅผ ์ฌ์ฉํ์ฌ ์๋กญ๊ณ ๋ ํฐ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ํ ๋นํ์ฌ ์ฉ๋์ ๋ ๋ฐฐ๋ก ๋๋ฆฝ๋๋ค. - ๋ณต์ฌ: ๊ธฐ์กด ์์๋ฅผ ์ ๋ฉ๋ชจ๋ฆฌ ์์น๋ก ๋ณต์ฌํฉ๋๋ค.
- ์ ๋ฐ์ดํธ: ๋ฐฐ์ด์ ํฌ์ธํฐ์ ์ฉ๋์ ์ ๋ฐ์ดํธํฉ๋๋ค.
- ์ฝ์ : ์ ์์๋ฅผ ์ฝ์ ํฉ๋๋ค.
์ด ์ ๊ทผ ๋ฐฉ์์ ํตํด ๋ ๋ง์ ์์๊ฐ ์ถ๊ฐ๋จ์ ๋ฐ๋ผ ๋ฐฐ์ด์ด ๋์ ์ผ๋ก ์ปค์ง ์ ์์ต๋๋ค.
2. ์ด๋ฏธ์ง ์ฒ๋ฆฌ
์ด๋ฏธ์ง ์ฒ๋ฆฌ๋ฅผ ์ํํ๋ Wasm ๋ชจ๋์ ์๊ฐํด ๋ด ์๋ค. ์ด๋ฏธ์ง๋ฅผ ๋ก๋ํ ๋ ๋ชจ๋์ ํฝ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํด์ผ ํฉ๋๋ค. ์ด๋ฏธ์ง ํฌ๊ธฐ๋ฅผ ๋ฏธ๋ฆฌ ์ ์ ์๋ ๊ฒฝ์ฐ ๋ชจ๋์ ์ด๊ธฐ ๋ฒํผ๋ก ์์ํ์ฌ ์ด๋ฏธ์ง ๋ฐ์ดํฐ๋ฅผ ์ฝ๋ ๋์ ํ์์ ๋ฐ๋ผ ํ์ฅํ ์ ์์ต๋๋ค.
๊ฐ๋ ์ ๋จ๊ณ:
- ์ด๊ธฐ ๋ฒํผ: ์ด๋ฏธ์ง ๋ฐ์ดํฐ๋ฅผ ์ํ ์ด๊ธฐ ๋ฒํผ๋ฅผ ํ ๋นํฉ๋๋ค.
- ๋ฐ์ดํฐ ์ฝ๊ธฐ: ํ์ผ ๋๋ ๋คํธ์ํฌ ์คํธ๋ฆผ์์ ์ด๋ฏธ์ง ๋ฐ์ดํฐ๋ฅผ ์ฝ์ต๋๋ค.
- ์ฉ๋ ํ์ธ: ๋ฐ์ดํฐ๊ฐ ์ฝํ ๋ ๋ฒํผ๊ฐ ๋ค์ด์ค๋ ๋ฐ์ดํฐ๋ฅผ ๋ด์ ๋งํผ ์ถฉ๋ถํ ํฐ์ง ํ์ธํฉ๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ ํ์ฅ: ๋ฒํผ๊ฐ ๊ฐ๋ ์ฐจ๋ฉด
memory.grow๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋ฐ์ดํฐ๋ฅผ ์์ฉํ๋๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ฅํฉ๋๋ค. - ์ฝ๊ธฐ ๊ณ์: ์ ์ฒด ์ด๋ฏธ์ง๊ฐ ๋ก๋๋ ๋๊น์ง ์ด๋ฏธ์ง ๋ฐ์ดํฐ๋ฅผ ๊ณ์ ์ฝ์ต๋๋ค.
3. ํ ์คํธ ์ฒ๋ฆฌ
ํฐ ํ ์คํธ ํ์ผ์ ์ฒ๋ฆฌํ ๋ Wasm ๋ชจ๋์ ํ ์คํธ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํด์ผ ํ ์ ์์ต๋๋ค. ์ด๋ฏธ์ง ์ฒ๋ฆฌ์ ์ ์ฌํ๊ฒ ๋ชจ๋์ ์ด๊ธฐ ๋ฒํผ๋ก ์์ํ์ฌ ํ ์คํธ ํ์ผ์ ์ฝ์ผ๋ฉด์ ํ์์ ๋ฐ๋ผ ํ์ฅํ ์ ์์ต๋๋ค.
๋น๋ธ๋ผ์ฐ์ WebAssembly ๋ฐ WASI
WebAssembly๋ ์น ๋ธ๋ผ์ฐ์ ์๋ง ๊ตญํ๋์ง ์์ต๋๋ค. ์๋ฒ, ์๋ฒ ๋๋ ์์คํ ๋ฐ ๋ ๋ฆฝํ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ๊ฐ์ ๋น๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. WASI(WebAssembly System Interface)๋ Wasm ๋ชจ๋์ด ์ด์ ๊ฐ๋ฅํ ๋ฐฉ์์ผ๋ก ์ด์ ์ฒด์ ์ ์ํธ ์์ฉํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ ํ์ค์ ๋๋ค.
๋น๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์๋ ์ ํ ๋ฉ๋ชจ๋ฆฌ ํ์ฅ์ ์ ์ฌํ ๋ฐฉ์์ผ๋ก ์๋ํ์ง๋ง ๊ธฐ๋ณธ ๊ตฌํ์ ๋ค๋ฅผ ์ ์์ต๋๋ค. Wasm ๋ฐํ์(์: V8, Wasmtime ๋๋ Wasmer)์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ๊ด๋ฆฌํ๊ณ ํ์์ ๋ฐ๋ผ ์ ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ฅํ๋ ์ฑ ์์ด ์์ต๋๋ค. WASI ํ์ค์ ๋์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ํฌํจํ ์ ์๋ ํ์ผ ์ฝ๊ธฐ ๋ฐ ์ฐ๊ธฐ์ ๊ฐ์ ํธ์คํธ ์ด์ ์ฒด์ ์์ ์ํธ ์์ฉ์ ์ํ ํจ์๋ฅผ ์ ๊ณตํฉ๋๋ค.
๋ณด์ ๊ณ ๋ ค ์ฌํญ
WebAssembly๋ ์์ ํ ์คํ ํ๊ฒฝ์ ์ ๊ณตํ์ง๋ง ์ ํ ๋ฉ๋ชจ๋ฆฌ ํ์ฅ๊ณผ ๊ด๋ จ๋ ์ ์ฌ์ ์ธ ๋ณด์ ์ํ์ ์ธ์งํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค:
- ์ ์ ์ค๋ฒํ๋ก์ฐ: ์ ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ๋ฅผ ๊ณ์ฐํ ๋ ์ ์ ์ค๋ฒํ๋ก์ฐ์ ์ฃผ์ํ์ญ์์ค. ์ค๋ฒํ๋ก์ฐ๋ ์์๋ณด๋ค ์์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ผ๋ก ์ด์ด์ ธ ๋ฒํผ ์ค๋ฒํ๋ก์ฐ๋ ๊ธฐํ ๋ฉ๋ชจ๋ฆฌ ์์ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์์ต๋๋ค. ์ ์ ํ ๋ฐ์ดํฐ ํ์
(์: 64๋นํธ ์ ์)์ ์ฌ์ฉํ๊ณ
memory.grow๋ฅผ ํธ์ถํ๊ธฐ ์ ์ ์ค๋ฒํ๋ก์ฐ๋ฅผ ํ์ธํ์ญ์์ค. - ์๋น์ค ๊ฑฐ๋ถ ๊ณต๊ฒฉ: ์
์์ ์ธ Wasm ๋ชจ๋์
memory.grow๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ํธ์ถํ์ฌ ํธ์คํธ ํ๊ฒฝ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณ ๊ฐ์ํค๋ ค๊ณ ์๋ํ ์ ์์ต๋๋ค. ์ด๋ฅผ ์ํํ๋ ค๋ฉด ํฉ๋ฆฌ์ ์ธ ์ต๋ ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ๋ฅผ ์ค์ ํ๊ณ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ๋ชจ๋ํฐ๋งํ์ญ์์ค. - ๋ฉ๋ชจ๋ฆฌ ๋์: ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ ๋น๋์์ง๋ง ํด์ ๋์ง ์์ผ๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์ด๋ ๊ฒฐ๊ตญ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณ ๊ฐ์ํค๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ถฉ๋ํ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค. ๋ ์ด์ ํ์ํ์ง ์์ ๋ฉ๋ชจ๋ฆฌ๋ ํญ์ ์ ๋๋ก ํด์ ํด์ผ ํฉ๋๋ค.
WebAssembly ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ์ํ ๋๊ตฌ ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
์ฌ๋ฌ ๋๊ตฌ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ WebAssembly์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ๋จ์ํํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค:
- Emscripten: Emscripten์ C ๋ฐ C++ ์ฝ๋๋ฅผ WebAssembly๋ก ์ปดํ์ผํ๊ธฐ ์ํ ์์ ํ ํด์ฒด์ธ์ ์ ๊ณตํฉ๋๋ค. ์ฌ๊ธฐ์๋ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ๋ฐ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ์ํ ๊ธฐํ ์ ํธ๋ฆฌํฐ๊ฐ ํฌํจ๋ฉ๋๋ค.
- Binaryen: Binaryen์ WebAssembly๋ฅผ ์ํ ์ปดํ์ผ๋ฌ ๋ฐ ํด์ฒด์ธ ์ธํ๋ผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. ๋ฉ๋ชจ๋ฆฌ ๊ด๋ จ ์ต์ ํ๋ฅผ ํฌํจํ์ฌ Wasm ์ฝ๋๋ฅผ ์ต์ ํํ๊ณ ์กฐ์ํ๊ธฐ ์ํ ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค.
- WASI SDK: WASI SDK๋ ๋น๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์ ์คํํ ์ ์๋ WebAssembly ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๊ธฐ ์ํ ๋๊ตฌ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ์ธ์ด๋ณ ๋ผ์ด๋ธ๋ฌ๋ฆฌ: ๋ง์ ์ธ์ด์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ์ํ ์์ฒด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, Rust์๋ ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ํ์์ฑ์ ์์ ๋ ์์ ๊ถ ๋ฐ ๋์ฌ ์์คํ ์ด ์์ต๋๋ค.
๊ฒฐ๋ก
์ ํ ๋ฉ๋ชจ๋ฆฌ ํ์ฅ์ ๋์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ๊ฐ๋ฅํ๊ฒ ํ๋ WebAssembly์ ๊ธฐ๋ณธ ๊ธฐ๋ฅ์ ๋๋ค. ์๋ ๋ฐฉ์์ ์ดํดํ๊ณ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ์ํ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๋ ๊ฒ์ ์ฑ๋ฅ์ด ๋ฐ์ด๋๊ณ ์์ ํ๋ฉฐ ๊ฒฌ๊ณ ํ Wasm ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค. ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ์ ์คํ๊ฒ ๊ด๋ฆฌํ๊ณ , ๋ฉ๋ชจ๋ฆฌ ๋ณต์ฌ๋ฅผ ์ต์ํํ๋ฉฐ, ์ ์ ํ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํจ์จ์ ์ผ๋ก ํ์ฉํ๊ณ ์ ์ฌ์ ์ธ ํจ์ ์ ํผํ๋ Wasm ๋ชจ๋์ ๋ง๋ค ์ ์์ต๋๋ค. WebAssembly๊ฐ ๊ณ์ํด์ ์งํํ๊ณ ๋ธ๋ผ์ฐ์ ๋ฅผ ๋์ด ํ์ฅ๋จ์ ๋ฐ๋ผ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๋ฅ๋ ฅ์ ๋ค์ํ ํ๋ซํผ์์ ๊ด๋ฒ์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ๋ํ๋ ๋ฐ ํ์์ ์ผ ๊ฒ์ ๋๋ค.
ํญ์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ๋ณด์์ ์ํฅ์ ๊ณ ๋ คํ๊ณ ์ ์ ์ค๋ฒํ๋ก์ฐ, ์๋น์ค ๊ฑฐ๋ถ ๊ณต๊ฒฉ ๋ฐ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํ ์กฐ์น๋ฅผ ์ทจํด์ผ ํฉ๋๋ค. ์ ์คํ ๊ณํ๊ณผ ์ธ๋ถ ์ฌํญ์ ๋ํ ์ฃผ์๋ฅผ ๊ธฐ์ธ์ด๋ฉด WebAssembly ์ ํ ๋ฉ๋ชจ๋ฆฌ ํ์ฅ์ ํ์ ํ์ฉํ์ฌ ๋๋ผ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์์ต๋๋ค.